package com.common.app.utls

import android.content.Context
import android.util.Log
import com.common.base.utils.AppUtils
import com.common.base.utils.LogUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import java.util.Locale
import kotlin.coroutines.CoroutineContext
//import com.netease.htprotect.HTProtect
//import com.netease.htprotect.HTProtectConfig
//import com.netease.htprotect.callback.HTPCallback
//import com.netease.htprotect.result.AntiCheatResult


/**
 *
 * 作者：sosou
 *
 * 版本：1.0
 *
 * 创建日期：11/7/2023
 *
 * 描述：
 *
 * 修订历史：
 *
 */
object HTProtectUtils {

    // 易盾分配的产品id，可登录易盾后台获取
    private const val PRODUCT_ID = "YD00671375725785"

    // 易盾分配的反外挂业务id，可登录易盾后台获取
//    private const val HTP_BUSINESS_ID = "f2d625b5b17691b6d518f8ef2f071134"
    private const val HTP_BUSINESS_ID = "785f00f29e8b70a1e124758c8408d1f0"

    // 易盾分配的反作弊业务id，可登录易盾后台获取
    private const val LOGIN_BUSINESS_ID = ""

    // 易盾分配的 gamekey，可登录易盾后台获取
    // 如果没有调用数据签名、心跳、存档加解密接口，此值可以为空或者不设置
    private const val GAME_KEY = ""

    var inited = false

    private val htProtectCoroutineScope = CoroutineScope(Dispatchers.IO)

    //    private var instance: HTProtectUtils? = null
//
//    fun getInstance(): HTProtectUtils {
//        if (instance == null) {
//            synchronized(HTProtectUtils::class.java) {
//                if (instance == null) {
//                    instance = HTProtectUtils()
//                }
//            }
//        }
//        return instance!!
//    }
//
    // 同步接口，必须在子线程中调用
    fun getTokenSync2(): String {
//        if (!inited) {
//            return ""
//        }
//        val acResult = HTProtect.getToken(3000, HTP_BUSINESS_ID)
//        LogUtils.e("code:" + acResult.code)
//        if (acResult.code == AntiCheatResult.OK) {
//            // 调用成功，获取token
//            LogUtils.e("sync token:" + acResult.token)
//            return acResult.token
//        }
        return ""
    }

//    // 同步接口，必须在协程或子线程中调用
//    suspend fun getTokenSync(): String? {
//        return withContext(Dispatchers.IO) {
//            val acResult = HTProtect.getToken(3000, HTP_BUSINESS_ID)
//            LogUtils.e("code:" + acResult.code)
//            if (acResult.code == AntiCheatResult.OK) {
//                // 调用成功，获取token
//                LogUtils.e("sync token:" + acResult.token)
//                acResult.token
//            } else {
//                null
//            }
//        }
//    }

    // 异步接口
    fun getTokenAsync(callback: (String?) -> Unit) {
//        htProtectCoroutineScope.launch {
//            val acResult = withContext(Dispatchers.IO) {
//                HTProtect.getToken(3000, HTP_BUSINESS_ID)
//            }
//            LogUtils.e("code:${acResult.code}")
//            if (acResult.code == AntiCheatResult.OK) {
//                // 调用成功，获取token
//                LogUtils.e("async token:${acResult.token}")
//                callback(acResult.token)
//            } else {
//                callback(null)
//            }
//        }
    }

    // 取消异步操作
    fun cancelTokenRequest() {
        htProtectCoroutineScope.coroutineContext.cancelChildren()
    }

    // 取消异步操作
    fun initHtp(mContext: Context, mType: Int = 1) {
//        if (inited) return
//        try {
//            val mCallback = HTPCallback { code, msg ->
//                LogUtils.e("HTProtectInitCode is:$code msg is:$msg")
//                // 如果code == 200，说明反外挂一切正常
//                // 如果code == 400，请将 msg 发送到贵方服务端，由贵方服务端转发给易盾服务端，由易盾服务端响应，
//                // 返回结果，再将结果通过 通用查询接口(Cmd_SetConfigData) 反馈给反外挂sdk
//                // com.netease.htprotect.HTProtect.ioctl(RequestCmdID.Cmd_SetConfigData.value, responseData); responseData为易盾服务端返回的数据
//            }
//            val config = HTProtectConfig()
//            config.setGameKey(GAME_KEY) // 易盾HTP分配gameKey，与手游加固的appKey对应，gameKey可登陆易盾后台获取([数据校验]，[存档加解密]和[心跳系统]必须设置此值，如果不使用这三个功能，可不设置或置空)
//            config.setServerType(mType) // 服务器所在地址，1：中国大陆，2：中国台湾地区，3：其他地区
//            config.setChannel("testchannel") // 渠道
////            config.setExtraData("1", "hello") // 额外信息，反作弊接口需要，可不设置
//            // init接口种 context 和 appid 必传，callback 和 config可选
//            HTProtect.init(mContext, PRODUCT_ID, mCallback, config)
////            // 启动防剥离线程，可选
////            HtpCheckCoroutine().startChecking()
//            inited = true
//        } catch (e: RuntimeException) {
//            //若对打包出来的apk，删除反外挂的so，会抛出该异常
//            LogUtils.e(e.message.toString())
//            //针对该异常，有2种建议方式：
//            //一是不捕捉，找不到反外挂so，游戏在调用反外挂接口时会闪退
//            //二是捕捉该异常，并将该异常信息上报到服务端进行标记处理
//            //需要自己发送data数据到服务端
//            //postDataToServer(e.getMessage().toString());  该函数接入方需自己实现
//        } catch (e: UnsatisfiedLinkError) {
//            //若使用其他so来伪装反外挂so，会抛出该异常
//            LogUtils.e(e.message.toString())
//            //针对该异常，有2种建议方式：
//            //一是不捕捉，找不到反外挂的对应接口的话，游戏在调用反外挂接口时会闪退
//            //二是捕捉该异常，并将该异常信息上报到服务端进行标记处理
//            //postDataToServer(e.getMessage().toString());  该函数接入方需自己实现
//        }
    }


    /**
     * htp防剥离线程，验证反外挂是否已经正常启动，建议在初始化完成之后，立马调用
     * 可简单判断反外挂是否正常启动，接入简单，如果依然被剥离，建议接入心跳或透传服务
     */
    class HtpCheckCoroutine : CoroutineScope {
        private val job: Job
        override val coroutineContext: CoroutineContext
            get() = Dispatchers.Default + job

        constructor(context: CoroutineContext) {
            job = SupervisorJob()
            CoroutineScope(context + job)
        }

        constructor() : this(Dispatchers.Default)

        fun startChecking() {
//            launch {
//                delay(30000) // 延迟 30 秒
//                val checkValue = com.netease.htprotect.poly.a.a
//                if (!checkValue) {
//                    // 若结果为 false，则说明反外挂没有启动起来
//                    Log.e("callback", "callback not called")
//                    cancel()
//                } else {
//                    Log.d("callback", "htp init ok")
//                    cancel()
//                }
//            }
        }

        fun cancel() {
            job.cancel()
        }
    }

    // 数美
    fun initSm() {
//        if (inited) return
//
//        val option = SmAntiFraud.SmOption()
//        option.setOrganization("RXmkGt3qhxqMbC7qS1Wq")
//        option.setAppId("default")
//        option.setPublicKey(
//            "MIIDLzCCAhegAwIBAgIBMDANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjELMAkGA1UECwwCU00xFjAUBgNVBAMMDWUuaXNodW1laS5jb20wHhcNMjMwNzEwMTAzMDA2WhcNNDMwNzA1MTAzMDA2WjAyMQswCQYDVQQGEwJDTjELMAkGA1UECwwCU00xFjAUBgNVBAMMDWUuaXNodW1laS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpjIYCR0XbVjkP3jsSQpwEUnpBhrjoapP8G4+OVY01W6dCNLdjhOTzqFOHB2v9es5TSpOHslSiA0iqPT9sM7gLrTpCCpbULv9A2ZPtYygIPhdDr2oQy0uSU1qZRR2kpEAvOC1j/028qJUMOd0G17rAYANn2gooG68B/kE4uDeB8nfCysRZVF4X1r3hl2He8iuutJFk67qiHt/LsSLJ+ovPH/N6pjmpHn3lzoTIGgHusGgjXMTTGoxmDdQwICGe656qXII5i9lO+iWu8M6fC3kvtWXFMH+GokLypBJi02KS3R58rUis8Knzbl1HGf99W2y4HHpetlKRNKeOXRV8YhTXAgMBAAGjUDBOMB0GA1UdDgQWBBSVFAC8hbDCK+BHo2CUOOcr71hr+DAfBgNVHSMEGDAWgBSVFAC8hbDCK+BHo2CUOOcr71hr+DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQDbVUT8vzFsnjwGmykWs2wDY4l0BRkasEfGS/4KWc0tCo0SNxkSYe/N/jP1S9pb+M4ey+GK50zUdyQOESkDSlKo0Gsx4oHVQDYP6KWPN8zAiFWcQiJEFiDceogy0YcB0HGcnYaO8pN+AMQz1Rnxie3Hmnlmx0LOQkkrjhBvYUV+LAW9shPRXVqdvqvqC8KiakZ7jr0OlkPXxqFQ11mPwaQak5QyncoY1e+1mHxI3j3pSds5khBA/Y6KR0VOAzB+3d+qgnlnJK4t40KGiyctKTNipVvkNjwYu+702embTqfu6n+mylMe9M2z6qo/AoKqkPzF1GU7Z4mAyuVCuLRG40uw"
//        )
//        SmAntiFraud.registerServerIdCallback(object : SmAntiFraud.IServerSmidCallback {
//            override fun onSuccess(boxId: String) {
//                inited = true
//                Constants.smToken = boxId
//            }
//
//            override fun onError(code: Int) {
//                inited = false
//                when (code) {
//                    -1 -> LogUtils.e("onError: (ERROR_NO_NETWORK)")
//                    -2 -> LogUtils.e("onError: (ERROR_NO_RESPONSE)")
//                    -3 -> LogUtils.e("onError: (ERROR_SERVER_RESPONSE)")
//                    else -> LogUtils.e("onError: (ERROR_UNKNOWN)")
//                }
//
//            }
//        })
//        SmAntiFraud.create(AppUtils.getContext(), option)
    }


    // 数美
    fun getSmDeviceId(): String? {
//        if (!inited) {
//            initSm()
            return ""
//        }
//        return SmAntiFraud.getDeviceId()
    }
}
